home *** CD-ROM | disk | FTP | other *** search
- /*
- T64 TapeMaker
- Creates a T64 file and imports C64 files
- T64 is a standard C64S tape image
- C64 file must be in standard PRG format:
- 2 bytes start address, the other bytes file contents
- */
-
- #include <io.h>
- #include <dos.h>
- #include <string.h>
- #include <fcntl.h>
-
- #define NEWSIZE 30
- #define BUFSIZE 16384
-
- typedef struct
- {
- char
- text [32];
- int
- version, entries, used, xxx;
- char
- name [24];
- }
- HEADER;
-
- typedef struct
- {
- unsigned char
- etype, ctype;
- unsigned int
- start, end, xxx1;
- unsigned long
- fpos, xxx2;
- char
- name [16];
- }
- ENTRY;
-
- char
- buffer [BUFSIZE];
-
- void main( int argc, char **argv )
- {
- char
- name [256];
- HEADER
- header =
- {
- "C64 tape image file",
- 0x100,
- NEWSIZE,
- 0, 0,
- "IMPORTED FILES "
- };
- ENTRY
- entry =
- {
- 0, 0,
- 0, 0, 0,
- 0, 0,
- ""
- };
- int
- t, f, n, nf, r;
- unsigned long
- pos;
-
- if( argc == 1 )
- {
- printf( "Usage: MAKETAPE t64name [file1 [file2 ...]]\n" );
- return;
- }
- strcpy( name, argv[1] );
- strcat( name, ".T64" );
- if( (t = _open( name, O_RDWR )) < 0 )
- {
- if( (t = _creat( name, FA_ARCH )) < 0 )
- {
- printf( "Can't create file: %s\n", name );
- return;
- }
- printf( "Creating file: %s\n", name );
- _write( t, &header, sizeof( header ));
- for( n = nf = 0; n < NEWSIZE; n++ )
- _write( t, &entry, sizeof( entry ));
- }
- else
- {
- printf( "Openning file: %s\n", name );
- _read( t, &header, sizeof( header ));
- _read( t, &entry, sizeof( entry ));
- for( n = 0; entry.etype != 0 && n < header.entries; n++ )
- {
- _read( t, &entry, sizeof( entry ));
- }
- nf = n;
- }
- for( n = 2; n < argc && nf < header.entries; n++ )
- {
- if( (f = _open( argv[n], O_RDONLY )) < 0 )
- {
- printf( "Can't open: %s\n", argv[n] );
- }
- else
- {
- printf( "Importing file: %s\n", argv[n] );
- _read( f, &entry.start, 2 );
- entry.end = entry.start;
- entry.etype = 1;
- entry.ctype = 1;
- entry.fpos = filelength( t );
- lseek( t, entry.fpos, SEEK_SET );
- for( r = _read( f, buffer, BUFSIZE ); r > 0;
- r = _read( f, buffer, BUFSIZE ))
- {
- _write( t, buffer, r );
- entry.end += r;
- }
- _close( f );
- strcpy( name, argv[n] );
- strupr( name );
- strcat( name, " " );
- strncpy( entry.name, name, 16 );
- lseek( t, sizeof( header ) + nf * sizeof( entry ), SEEK_SET );
- _write( t, &entry, sizeof( entry ));
- nf++;
- }
- }
- header.used = nf;
- lseek( t, 0, SEEK_SET );
- _write( t, &header, sizeof( header ));
- _close( t );
- printf( "O.K.\n" );
- }
-
-
-
-